package org.checkerframework.dataflow.analysis;

import org.checkerframework.checker.nullness.qual.Nullable;

/**
 * This interface defines a backward analysis, given a control flow graph and a backward transfer
 * function.
 *
 * @param <V> the abstract value type to be tracked by the analysis
 * @param <S> the store type used in the analysis
 * @param <T> the backward transfer function type that is used to approximate run-time behavior
 */
public interface BackwardAnalysis<
        V extends AbstractValue<V>, S extends Store<S>, T extends BackwardTransferFunction<V, S>>
    extends Analysis<V, S, T> {

  /**
   * Returns the output store at the entry block of a given control flow graph. For a backward
   * analysis, the output store contains the analyzed flow information from the exit block to the
   * entry block.
   *
   * @return the output store at the entry block of a given control flow graph
   */
  @Nullable S getEntryStore();
}
